import logging
import logging.handlers
from flask import request
import os


class RequestFinancialFormatter(logging.Formatter):
    """
    自定义的日志输出格式
    """

    def format(self, record):
        record.url = request.url  # 需要在日志中记录请求地址
        record.remote_addr = request.remote_addr  # 需要在日志中记录客户端的地址
        return super().format(record)

# 创建一个个性化的logger对象
def create_logger(app):
    logging_file_dir = app.config['LOGGING_FILE_DIR']  #
    logging_file_max_bytes = app.config['LOGGING_FILE_MAX_BYTES']  #
    logging_file_backup = app.config['LOGGING_FILE_BACKUP']  #
    logging_file_level = app.config['LOGGING_LEVEL']

    # 设置日志的输出格式
    request_formatter = RequestFinancialFormatter(
        '[%(asctime)s] [%(remote_addr)s]  请求 %(url)s \t %(levelname)s 在%(module)s %(lineno)d :  %(message)s')
    # 如果目录不存在，则创建目录
    if os.path.isdir(logging_file_dir):
        pass
    else:
        os.makedirs(logging_file_dir)
    # 自定义一个目录和日志文件  RotatingFileHandler：按照指定的文件大小来规定日志文件的生产规则
    # flack_file_handler = logging.handlers.RotatingFileHandler(filename=os.path.join(logging_file_dir, 'financial.log'),
    #                                                           maxBytes=logging_file_max_bytes,
    #                                                           backupCount=logging_file_backup,
    #                                                           encoding='utf-8')
    # TimedRotatingFileHandler： 根据时间来规定日志文件的生成规则
    flack_file_handler = logging.handlers.TimedRotatingFileHandler(filename=os.path.join(logging_file_dir, 'financial_'+str(os.getpid())+'.log'),
                                                                   when='D', interval=1, backupCount=logging_file_backup, encoding='utf-8')
    # 给当前的handler设置格式
    flack_file_handler.setFormatter(request_formatter)
    # 得到一个logger对象， 根据包名
    flack_logger = logging.getLogger('financial')
    # 关键修复：清除可能存在的旧handler
    if flack_logger.hasHandlers():
        for handler in flack_logger.handlers[:]:
            flack_logger.removeHandler(handler)
    flack_logger.addHandler(flack_file_handler)
    flack_logger.setLevel(logging_file_level)

    # 整个项目需要两个handler：文件/控制台
    flask_console_handler = logging.StreamHandler()
    flask_console_handler.setFormatter(logging.Formatter('[%(asctime)s] [%(remote_addr)s]  请求 %(url)s \t %('
                                                         'levelname)s 在%(module)s %(lineno)d :  %(message)s'))
    # 当项目运行是debug环境，才用控制台输出
    # if app.debug:
    flack_logger.addHandler(flask_console_handler)